/*
*
* 版权所有 Copyleft(c) 2005
* 刘炯个人工作室 Sharp-Mark Personal Studio
*
* 允许自由使用，复制，修改，传播和贩卖此源程序及其文档，而不必支付任何费用。
* 以上的版权信息必须出现在每一份复制品中。同时这份版权信息和许可声明
* 也必须出现在支持文档中。刘炯个人工作室不对此软件适于那种具体
* 用途做出任何阐述。此代码只作为代码本身提供对其品质不做任何保证。
*
*/

#pragma once

typedef struct tagPOINT
{
	long  x;
	long  y;
} POINT;

class CEdge
{
	//static int x0, y0;
public:
	CEdge(int x1, int y1, int x2, int y2);
	CEdge(POINT p1, POINT p2);
	CEdge(){}
	int X1, Y1, X2, Y2;
	int xMax, xMin;
	int yMax, yMin;
	float dx;
};

class CPolygon
{
public:
	CPolygon();
	CPolygon(CEdge* edges, int num);
	CEdge* Edges;
	int Num;
};

class CEdgeNode
{
public:
	CEdgeNode();
	CEdgeNode(float x, float dx, int y) : X(x), Dx(dx),Y(y){}
	float X;
	float Dx;
	int Y;	// 当标识AE的时候，Y表示Ymax；当表示NE时，Y表示Ymin

	CEdgeNode operator-(const CEdgeNode& rhs) const;
	CEdgeNode operator+(const CEdgeNode& rhs) const;
	friend bool operator==(const CEdgeNode lhs, const CEdgeNode& rhs);
	friend bool operator<(const CEdgeNode lhs, const CEdgeNode& rhs);
	friend bool operator>(const CEdgeNode lhs, const CEdgeNode& rhs);
};

class CNewEdgeTable
{
public:
	CNewEdgeTable();
	CNewEdgeTable(int nodesNumber);
	~CNewEdgeTable();
	//EdgeNode** Link;
	vector<list< CEdgeNode >* > Links;
private:
	int _nodesNumber;
};

class CActiveEdgeTable
{
public:
	CActiveEdgeTable();
	list< CEdgeNode > Link;
	//int NodesNumber;
	void InsertNodes(list<CEdgeNode> * top);		// 按横坐标排列
private:
	//int _nodeNumber;
};

class CompareEdge
{
public:
	bool operator()(const CEdgeNode& n1, const CEdgeNode& n2) const
	{
		return (n1.X < n2.X);
	}
};